import { Injectable, NotFoundException } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}

  // 获取所有用户
  // Promise<User[]> 表示这个方法返回一个Promise，最终解析为User对象的数组
  async findAll(): Promise<User[]> {
    // find() 方法从数据库中检索所有用户记录
    return this.usersRepository.find();
  }

  // 根据ID获取单个用户
  async findOne(id: number): Promise<User> {
    // findOneBy({ id }) 方法根据ID查找单个用户
    const user = await this.usersRepository.findOneBy({ id });

    // 如果找不到用户，抛出NotFoundException异常
    if (!user) {
      throw new NotFoundException(`用户 ID ${id} 不存在`);
    }

    return user;
  }

  // 创建用户
  async create(createUserDto: CreateUserDto): Promise<User> {
    // create() 方法创建一个新的User实体实例，但不会保存到数据库
    const newUser = this.usersRepository.create(createUserDto);

    // save() 方法将新用户保存到数据库并返回保存后的用户对象（包含自动生成的ID）
    return this.usersRepository.save(newUser);
  }

  // 更新用户信息
  async update(id: number, updateUserDto: UpdateUserDto): Promise<User> {
    // 先调用findOne()检查用户是否存在，如果不存在会自动抛出异常
    const user = await this.findOne(id);

    // merge() 方法将updateUserDto中的属性合并到user对象中
    this.usersRepository.merge(user, updateUserDto);

    // save() 方法将更新后的用户保存到数据库
    return this.usersRepository.save(user);
  }

  // 删除用户
  async remove(id: number): Promise<void> {
    // delete() 方法从数据库中删除指定ID的用户
    const result = await this.usersRepository.delete(id);

    // 如果没有行被影响（即用户不存在），抛出NotFoundException异常
    if (result.affected === 0) {
      throw new NotFoundException(`用户 ID ${id} 不存在`);
    }
  }

  // 添加：根据邮箱查找用户
  async findByEmail(email: string): Promise<User | undefined> {
    return this.usersRepository.findOneBy({ email });
  }
}
